package com.example.common.utils;

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.*;

public class FileUtil {
    /**
     * 读取文件内容为字符串
     */
    public static String readFile(String path) {
        try {
            return new String(Files.readAllBytes(Paths.get(path)));
        } catch (IOException e) {
            return ""; // 文件不存在或读取失败时返回空字符串
        }
    }
    
    /**
     * 写入内容到文件（覆盖模式）
     * @throws IOException 无法写入（如路径错误、文件锁定、无权限、磁盘满等）
     */
    public static void writeFile(String path, String content) throws IOException {
        Files.write(Paths.get(path), content.getBytes());
    }
    
    /**
     * 追加内容到文件末尾
     * @throws IOException 无法写入（如路径错误、文件锁定、无权限、磁盘满等）
     */
    public static void appendToFile(String path, String content) throws IOException {
        Files.write(Paths.get(path), content.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    }
    
    /**
     * 删除文件
     */
    public static boolean deleteFile(String path) {
        return new File(path).delete();
    }
    
    /**
     * 判断文件是否存在
     */
    public static boolean fileExists(String path) {
        return Files.exists(Paths.get(path));
    }
    
    /**
     * 创建目录（如果不存在）
     * @throws IOException 权限问题或路径非法等异常
     */
    public static void createDirectory(String path) throws IOException {
        Files.createDirectories(Paths.get(path));
    }
    
    /**
     * 复制文件到目标路径
     * @throws IOException 无法写入（如路径错误、文件锁定、无权限等）
     */
    public static boolean copyFile(String sourcePath, String targetPath, boolean overwrite) throws IOException {
        Path source = Paths.get(sourcePath);
        Path target = Paths.get(targetPath);
        
        if (!overwrite && Files.exists(target)) {
            return false; // 不复制，目标文件已存在
        }
        
        CopyOption[] options = overwrite
                                   ? new CopyOption[]{StandardCopyOption.REPLACE_EXISTING}
                                   : new CopyOption[]{};
        Files.copy(source, target, options);
        return true;
    }
    
    /**
     * 获取文件扩展名
     */
    public static String getFileExtension(String filename) {
        int index = filename.lastIndexOf('.');
        return (index == -1) ? "" : filename.substring(index + 1);
    }
    
    /**
     * 获取文件名（不含路径）
     */
    public static String getFileName(String path) {
        return Paths.get(path).getFileName().toString();
    }
    
    /**
     * 获取文件所在目录
     */
    public static String getDirectory(String path) {
        Path parent = Paths.get(path).getParent();
        return parent != null ? parent.toString() : "";
    }
    
    /**
     * 读取目录下所有文件名
     * @throws IOException 如果目录不存在、不是目录或读取失败
     */
    public static List<String> listFiles(String directoryPath) throws IOException {
        try (Stream<Path> paths = Files.list(Paths.get(directoryPath))) {
            return paths
                       .filter(Files::isRegularFile)
                       .map(p -> p.getFileName().toString())
                       .collect(Collectors.toList());
        }
    }
}
